﻿//ComplexIndicatorValue.cs
//Copyright (c) 2013 StockSharp LLC, all rights reserved.
//This code module is part of StockSharp library.
//This code is licensed under the GNU GENERAL PUBLIC LICENSE Version 3.
//See the file License.txt for the license details.
//More info on: http://stocksharp.com

namespace StockSharp.Algo.Indicators
{
	using System;
	using System.Collections.Generic;
	using System.Linq;

	/// <summary>
	/// Комплексное значение индикатора <see cref="IComplexIndicator"/>, которое получается в результате вычисления.
	/// </summary>
	public class ComplexIndicatorValue : IIndicatorValue
	{
		/// <summary>
		/// Создать <see cref="ComplexIndicatorValue"/>.
		/// </summary>
		public ComplexIndicatorValue()
		{
			InnerValues = new Dictionary<IIndicator, IIndicatorValue>();
		}

		/// <summary>
		/// Значение индикатора отсутствует.
		/// </summary>
		public bool IsEmpty { get; set; }

		/// <summary>
		/// Является ли значение окончательным (индикатор окончательно формирует свое значение и более не будет изменяться в данной точке времени).
		/// </summary>
		public bool IsFinal { get; set; }

		/// <summary>
		/// Вложенные значения.
		/// </summary>
		public IDictionary<IIndicator, IIndicatorValue> InnerValues { get; private set; }

		/// <summary>
		/// Поддерживает ли значение необходимый для индикатора тип данных.
		/// </summary>
		/// <param name="valueType">Тип данных, которым оперирует индикатор.</param>
		/// <returns>True, если тип данных поддерживается, иначе, false.</returns>
		bool IIndicatorValue.IsSupport(Type valueType)
		{
			return InnerValues.Any(v => v.Value.IsSupport(valueType));
		}

		/// <summary>
		/// Получить значение по типу данных.
		/// </summary>
		/// <typeparam name="T">Тип данных, которым оперирует индикатор.</typeparam>
		/// <returns>Значение.</returns>
		public virtual T GetValue<T>()
		{
			throw new NotSupportedException();
		}

		/// <summary>
		/// Изменить входное значение индикатора новым значением (например, оно получено от другого индикатора).
		/// </summary>
		/// <typeparam name="T">Тип данных, которым оперирует индикатор.</typeparam>
		/// <param name="value">Значение.</param>
		/// <returns>Измененная копия входного значения.</returns>
		public virtual IIndicatorValue SetValue<T>(T value)
		{
			throw new NotSupportedException();
		}
	}
}